<?php

/**
 * This is the model class for table "{{post}}".
 *
 * The followings are the available columns in table '{{post}}':
 * @property integer $id
 * @property string $title
 * @property string $content
 * @property string $tags
 * @property integer $status
 * @property integer $create_time
 * @property integer $update_time
 * @property integer $author_id
 *
 * The followings are the available model relations:
 * @property Comment[] $comments
 * @property User $author
 */
class Post extends CActiveRecord
{

        const STATUS_DRAFT = 1;
        const STATUS_PUBLISHED = 2;
        const STATUS_ARCHIVED = 3;

        private $_oldTag;

        /**
         * Auto generate create_time and author_id before save post
         * @see CActiveRecord::beforeSave()
         */
        protected function beforeSave()
        {
                parent::beforeSave();

                if ($this->isNewRecord)
                {
                        $this->create_time = $this->update_time = time();
                        $this->author_id = Yii::app()->user->id;
                } else
                {
                        $this->update_time = time();
                }
                return true;
        }

        protected function afterFind()
        {
                parent::afterFind();
                $this->_oldTag = $this->tags;
        }

        /**
         * Update tag frequency 
         * @see CActiveRecord::afterSave()
         */
        protected function afterSave()
        {
                parent::afterSave();
                if ($this->_oldTag != $this->tags)
                {
                        if ($this->isNewRecord)
                        {
                                $this->_oldTag = '';
                        }
                        Tag::model()->updateFrequency($this->_oldTag, $this->tags);
                }
                if ($this->isNewRecord)
                {
                        Postviews::model()->addRelatedPostiview($this->id);
                }
        }

        protected function afterDelete()
        {
                parent::afterDelete();
                Tag::model()->updateFrequency($this->_oldTag, "");
        }

        /**
         * 
         * Get relative comments provider for listview
         */
        public function getRelativeCommentsProvider()
        {
                return new CActiveDataProvider('Comment', array(
                                'criteria' => array(
                                        'condition' => 'status=' . Comment::STATUS_APPROVED . ' AND post_id=' . $this->id,
                                        'order' => 'create_time DESC',
                                ),
                                'pagination' => array(
                                        'pageSize' => 20,
                                ),
                        ));
        }

        /**
         * 
         * Add comment of the spacialized post
         * @param Comment $comment
         */
        public function addComment(Comment $comment)
        {
                $comment->status = Comment::STATUS_APPROVED;
                $comment->post_id = $this->id;
                return $comment->save();
        }

        public function increaseFrequncy()
        {
                $this->postviews->frequency++;
                $this->postviews->save();
        }

        /**
         * Returns the static model of the specified AR class.
         * @param string $className active record class name.
         * @return Post the static model class
         */
        public static function model($className = __CLASS__)
        {
                return parent::model($className);
        }

        /**
         * @return string the associated database table name
         */
        public function tableName()
        {
                return '{{post}}';
        }

        /**
         * @return array validation rules for model attributes.
         */
        public function rules()
        {
                // NOTE: you should only define rules for those attributes that
                // will receive user inputs.
                return array(
                        array('title, content', 'required'),
                        array('title', 'length', 'max' => 128),
                        array('tags,status,create_time,update_time,author_id', 'safe'),
                        // The following rule is used by search().
                        // Please remove those attributes that should not be searched.
                        array('id, title, content, tags, status, create_time, update_time, author_id', 'safe', 'on' => 'search'),
                );
        }

        /**
         * @return array relational rules.
         */
        public function relations()
        {
                // NOTE: you may need to adjust the relation name and the related
                // class name for the relations automatically generated below.
                return array(
                        'comments' => array(self::HAS_MANY, 'Comment', 'post_id',
                                'condition' => 'comments.status=' . Comment::STATUS_APPROVED,
                                'order' => 'comments.create_time DESC',
                        ),
                        'author' => array(self::BELONGS_TO, 'User', 'author_id'),
                        'commentCount' => array(self::STAT, 'Comment', 'post_id',
                                'condition' => 'status=' . Comment::STATUS_APPROVED,
                        ),
                        'postviews' => array(self::HAS_ONE, 'Postviews', 'id'),
                );
        }

        /**
         * @return array customized attribute labels (name=>label)
         */
        public function attributeLabels()
        {
                return array(
                        'id' => 'ID',
                        'title' => 'Title',
                        'content' => 'Content',
                        'tags' => 'Tags',
                        'status' => 'Status',
                        'create_time' => 'Create Time',
                        'update_time' => 'Update Time',
                        'author_id' => 'Author',
                        'frequency' => 'Views',
                );
        }

        /**
         * Retrieves a list of models based on the current search/filter conditions.
         * @return CActiveDataProvider the data provider that can return the models based on the search/filter conditions.
         */
        public function search()
        {
                // Warning: Please modify the following code to remove attributes that
                // should not be searched.

                $criteria = new CDbCriteria;

                $criteria->compare('id', $this->id);
                $criteria->compare('title', $this->title, true);
                $criteria->compare('content', $this->content, true);
                $criteria->compare('tags', $this->tags, true);
                $criteria->compare('status', $this->status);
                $criteria->compare('create_time', $this->create_time);
                $criteria->compare('update_time', $this->update_time);
                $criteria->compare('author_id', $this->author_id);

                return new CActiveDataProvider($this, array(
                                'criteria' => $criteria,
                        ));
        }

}